package org.jarchetypes.scanner; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Member; import java.lang.reflect.Method; import java.util.List; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; import org.apache.velocity.VelocityContext; import org.archetypes.common.ArchetypesUtils; import org.jarchetypes.annotation.Filter; import org.jarchetypes.annotation.InputText; import org.jarchetypes.descriptor.FilterDescriptor; import org.jarchetypes.descriptor.WidgetDescriptor; public class InputTextScanner extends ArchetypesScanner { private static final String TEMPLATE_NAME = "org/jarchetypes/scanner/templates/inputtext.vm"; private static final String FILTER_TEMPLATE_NAME = "org/jarchetypes/scanner/templates/inputtextfilter.vm"; static { InputTextScanner scanner = new InputTextScanner(); register(InputText.class, scanner); registerDefaultType(String.class, scanner); } @SuppressWarnings("unchecked") @Override protected void doScan(Class<?> archetype, Member member, VelocityContext context) { WidgetDescriptor descriptor = new WidgetDescriptor(); InputText annotation = (InputText) getAnnotation(InputText.class, member); String name = ArchetypesUtils.uncaptalize(ArchetypesUtils .getFieldName(member)); descriptor.setTemplateName(TEMPLATE_NAME); descriptor.setTitle(annotation != null && !"".equals(annotation.title())? annotation.title() : ArchetypesUtils.captalize(name)); descriptor.setFieldName(name); descriptor.setBeanName(ArchetypesUtils.uncaptalize(archetype .getSimpleName())); descriptor.setFieldType(member instanceof Method ? ((Method) member) .getReturnType().getName() : ((Field) member).getType() .getName()); FilterDescriptor filterDescriptor = new FilterDescriptor(descriptor); // filterDescriptor.setBeanName(ArchetypesUtils.uncaptalize(archetype // .getSimpleName()) + "SearchBean"); if(!isPresentAnnotationPanel(member instanceof Method ? ((Method) member) .getAnnotations() : ((Field) member).getAnnotations(), context,descriptor)){ ((List<WidgetDescriptor>) context.get("widgets")).add(descriptor); } // ((List<WidgetDescriptor>) context.get("widgets")).add(descriptor); filterDescriptor.setTemplateName(FILTER_TEMPLATE_NAME); scanForRequired(archetype, member, descriptor); scanForSize(archetype, member, descriptor); if (getAnnotation(Filter.class, member) != null) ((List<FilterDescriptor>) context.get("filters")) .add(filterDescriptor); } public void scanForRequired(Class<?> archetype, Member member, WidgetDescriptor descriptor) { boolean required = false; try { boolean isMethodAndHasNotNullAnnotation = member instanceof Method && (((Method) member).isAnnotationPresent(NotNull.class)); boolean isGetterAndFieldHasNotNullAnnotation = member instanceof Method && ArchetypesUtils.isGetter(member.getName()) && ArchetypesUtils.getField(archetype, ArchetypesUtils.getFieldName(member)) .isAnnotationPresent(NotNull.class); required = isMethodAndHasNotNullAnnotation || isGetterAndFieldHasNotNullAnnotation; } catch (Exception e) { e.printStackTrace(); } descriptor.setAttribute("required", required + ""); } public void scanForRegex(Class<?> archetype, Member member, WidgetDescriptor descriptor) { Pattern pattern = (Pattern) getAnnotation(Pattern.class, member); String regex = null; try { boolean isMethodAndHasNotNullAnnotation = member instanceof Method && (((Method) member).isAnnotationPresent(Pattern.class)); boolean isGetterAndFieldHasNotNullAnnotation = member instanceof Method && ArchetypesUtils.isGetter(member.getName()) && ArchetypesUtils.getField(archetype, ArchetypesUtils.getFieldName(member)) .isAnnotationPresent(Pattern.class); if (isMethodAndHasNotNullAnnotation || isGetterAndFieldHasNotNullAnnotation) { regex = pattern.regexp(); } } catch (Exception e) { e.printStackTrace(); } descriptor.setAttribute("regex", regex); } public void scanForSize(Class<?> archetype, Member member, WidgetDescriptor descriptor) { boolean isPresent = false; String minlength = Integer.toString(0); String maxlength = Integer.toString(Integer.MAX_VALUE); Size size = (Size) getAnnotation(Size.class, member); try { boolean isMethodAndHasNotNullAnnotation = member instanceof Method && (((Method) member).isAnnotationPresent(Size.class)); boolean isGetterAndFieldHasNotNullAnnotation = member instanceof Method && ArchetypesUtils.isGetter(member.getName()) && ArchetypesUtils.getField(archetype, ArchetypesUtils.getFieldName(member)) .isAnnotationPresent(Size.class); isPresent = isMethodAndHasNotNullAnnotation || isGetterAndFieldHasNotNullAnnotation; if (isPresent == true) { minlength = size != null && size.min() > 0 ? Integer .toString(size.min()) : null; maxlength = size != null && size.max() < Integer.MAX_VALUE ? Integer .toString(size.max()) : null; } else { minlength = null; maxlength = null; } } catch (Exception e) { e.printStackTrace(); } descriptor.setAttribute("min", minlength); descriptor.setAttribute("max", maxlength); } public Annotation getAnnotation(Class<? extends Annotation> annotationType, Member member) { if (member instanceof Field) { return ((Field) member).getAnnotation(annotationType); } else { return ((Method) member).getAnnotation(annotationType); } } @Override protected String getPath(Class<?> archetype) { return archetype.getSimpleName()+"Search.jsf"; } }